package com.webank.openledger.contracts;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import com.webank.openledger.core.common.BaseIdentity;

import org.fisco.bcos.sdk.abi.FunctionEncoder;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.Utils;
import org.fisco.bcos.sdk.abi.datatypes.Address;
import org.fisco.bcos.sdk.abi.datatypes.Bool;
import org.fisco.bcos.sdk.abi.datatypes.DynamicArray;
import org.fisco.bcos.sdk.abi.datatypes.DynamicBytes;
import org.fisco.bcos.sdk.abi.datatypes.Event;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.generated.Bytes32;
import org.fisco.bcos.sdk.abi.datatypes.generated.StaticArray4;
import org.fisco.bcos.sdk.abi.datatypes.generated.Uint256;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple2;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple3;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple5;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.eventsub.EventCallback;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;

@SuppressWarnings("unchecked")
public class Account extends Contract implements BaseIdentity {
    public static final String[] BINARY_ARRAY = {"60806040526040805190810160405280600681526020017f7075626c6963000000000000000000000000000000000000000000000000000081525060009080519060200190620000519291906200105f565b506040805190810160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f9291906200105f565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060029080519060200190620000ed9291906200105f565b506040805190810160405280600281526020017f5f72000000000000000000000000000000000000000000000000000000000000815250600390805190602001906200013b9291906200105f565b506040805190810160405280600281526020017f5f7700000000000000000000000000000000000000000000000000000000000081525060049080519060200190620001899291906200105f565b506040805190810160405280600381526020017f616c6c000000000000000000000000000000000000000000000000000000000081525060059080519060200190620001d79291906200105f565b506040805190810160405280600281526020017f696400000000000000000000000000000000000000000000000000000000000081525060069080519060200190620002259291906200105f565b506040805190810160405280600481526020017f616464720000000000000000000000000000000000000000000000000000000081525060079080519060200190620002739291906200105f565b506040805190810160405280600481526020017f747970650000000000000000000000000000000000000000000000000000000081525060089080519060200190620002c19291906200105f565b506040805190810160405280600481526020017f726f6c6500000000000000000000000000000000000000000000000000000000815250600990805190602001906200030f9291906200105f565b506040805190810160405280600781526020017f7075625f6b657900000000000000000000000000000000000000000000000000815250600a90805190602001906200035d9291906200105f565b506040805190810160405280600481526020017f6461746100000000000000000000000000000000000000000000000000000000815250600b9080519060200190620003ab9291906200105f565b506040805190810160405280600681526020017f726f6c655f720000000000000000000000000000000000000000000000000000815250600c9080519060200190620003f99291906200105f565b506040805190810160405280600681526020017f726f6c655f770000000000000000000000000000000000000000000000000000815250600d9080519060200190620004479291906200105f565b506040805190810160405280600c81526020017f6f70656e696e675f62616e6b0000000000000000000000000000000000000000815250600e9080519060200190620004959291906200105f565b506040805190810160405280600681526020017f6173736574730000000000000000000000000000000000000000000000000000815250600f9080519060200190620004e39291906200105f565b506040805190810160405280600781526020017f62616c616e63650000000000000000000000000000000000000000000000000081525060109080519060200190620005319291906200105f565b506040805190810160405280600681526020017f7265636f72640000000000000000000000000000000000000000000000000000815250601190805190602001906200057f9291906200105f565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060129080519060200190620005cd9291906200105f565b506040805190810160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250601390805190602001906200061b9291906200105f565b506040805190810160405280600581526020017f6f776e657200000000000000000000000000000000000000000000000000000081525060149080519060200190620006699291906200105f565b506040805190810160405280600481526020017f757365720000000000000000000000000000000000000000000000000000000081525060159080519060200190620006b79291906200105f565b5062010001601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010002601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010003601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010004601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620007d557600080fd5b5060405160408062006ddf8339810180604052620007f79190810190620012a0565b81816060620008303073ffffffffffffffffffffffffffffffffffffffff1662000c07640100000000026200579d176401000000009004565b9050620008f660068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620008d05780601f10620008a457610100808354040283529160200191620008d0565b820191906000526020600020905b815481529060010190602001808311620008b257829003601f168201915b505050505082601b62000ceb640100000000026200344117909291906401000000009004565b5082601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3032be86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620009bf57600080fd5b505af1158015620009d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620009fa919081019062001274565b601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55fc52d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000ac157600080fd5b505af115801562000ad6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000afc919081019062001274565b602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151562000bba5781601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000bfc565b30601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050505062001519565b6060600080836c0100000000000000000000000002915060146040519080825280601f01601f19166020018201604052801562000c535781602001602082028038833980820191505090505b509250600090505b601481101562000ce457818160148110151562000c7457fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002838281518110151562000ca657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505062000c5b565b5050919050565b60008084600001846040518082805190602001908083835b60208310151562000d2a578051825260208201915060208101905060208303925062000d03565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001549050600081111562000ee7577f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151562000e03578051825260208201915060208101905060208303925062000ddc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010160405162000e4c959493929190620013f8565b60405180910390a18285600001856040518082805190602001908083835b60208310151562000e91578051825260208201915060208101905060208303925062000e6a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000edc929190620010e6565b506001915062001057565b8285600001856040518082805190602001908083835b60208310151562000f24578051825260208201915060208101905060208303925062000efd565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000f6f929190620010e6565b5084600101805480919060010162000f8891906200116d565b90506001810185600001856040518082805190602001908083835b60208310151562000fca578051825260208201915060208101905060208303925062000fa3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000","01819055508385600101828154811015156200101757fe5b906000526020600020906002020160000190805190602001906200103d929190620010e6565b508460020160008154809291906001019190505550600091505b509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620010a257805160ff1916838001178555620010d3565b82800160010185558215620010d3579182015b82811115620010d2578251825591602001919060010190620010b5565b5b509050620010e29190620011a2565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200112957805160ff19168380011785556200115a565b828001600101855582156200115a579182015b82811115620011595782518255916020019190600101906200113c565b5b509050620011699190620011a2565b5090565b8154818355818111156200119d576002028160020283600052602060002091820191016200119c9190620011ca565b5b505050565b620011c791905b80821115620011c3576000816000905550600101620011a9565b5090565b90565b6200120f91905b808211156200120b5760008082016000620011ed919062001212565b6001820160006101000a81549060ff021916905550600201620011d1565b5090565b90565b50805460018160011615610100020316600290046000825580601f106200123a57506200125b565b601f0160209004906000526020600020908101906200125a9190620011a2565b5b50565b60006200126c8251620014b2565b905092915050565b6000602082840312156200128757600080fd5b600062001297848285016200125e565b91505092915050565b60008060408385031215620012b457600080fd5b6000620012c4858286016200125e565b9250506020620012d7858286016200125e565b9150509250929050565b620012ec8162001492565b82525050565b6000620012ff8262001487565b80845262001315816020860160208601620014d2565b620013208162001508565b602085010191505092915050565b60006200133b826200147c565b80845262001351816020860160208601620014d2565b6200135c8162001508565b602085010191505092915050565b6000815460018116600081146200138a5760018114620013ab57620013f0565b607f600283041680865260ff198316602087015260408601935050620013f0565b60028204808652602086019550620013c3856200146a565b60005b82811015620013e757815481890152600182019150602081019050620013c6565b80880195505050505b505092915050565b600060a0820190506200140f6000830188620012e1565b6200141e6020830187620012e1565b81810360408301526200143281866200132e565b90508181036060830152620014488185620012f2565b905081810360808301526200145e81846200136a565b90509695505050505050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620014f2578082015181840152602081019050620014d5565b8381111562001502576000848401525b50505050565b6000601f19601f8301169050919050565b6158b680620015296000396000f30060806040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301db8d891461024057806303ba71eb1461026b578063081f9339146102965780630c0fd886146102c15780630feca68a146102ec578063117803e31461031757806315e9977e1461034257806320ba5b601461036d57806323a772bd146103aa578063283d26ca146103d55780632a0acc6a146104005780632ef8cb1c1461042b57806339151753146104565780633a0e6174146104815780633b007d8e146104ac5780635262e2a1146104e957806357872d131461051457806358edef4c1461053f578063632e1dfe1461057c5780636709ecba146105a7578063699cc7f1146105e65780636adc4165146106115780637bdd20b21461063c57806381e167cf146106795780638662acad146106a4578063949d225d146106e157806395a0c7961461070c578063983d2737146107495780639d53fe2b14610774578063a066609a1461079f578063a18c751e146107de578063a26aa92a1461081b578063ac44522e14610858578063b11569f514610895578063b3032be8146108c0578063b3cea217146108eb578063b4eb5ede14610916578063b85a290114610941578063bb1239c31461096c578063bb24fe8a14610997578063c28304aa146109c2578063c55fc52d146109ed578063cb6163ad14610a18578063d087d28814610a55578063d6d7d52514610a80578063e8c2553a14610abd578063f307b32c14610afa575b600080fd5b34801561024c57600080fd5b50610255610b25565b6040516102629190615467565b60405180910390f35b34801561027757600080fd5b50610280610bc3565b60405161028d9190615467565b60405180910390f35b3480156102a257600080fd5b506102ab610c61565b6040516102b89190615467565b60405180910390f35b3480156102cd57600080fd5b506102d6610cff565b6040516102e39190615467565b60405180910390f35b3480156102f857600080fd5b50610301610d9d565b60405161030e91906155ab565b60405180910390f35b34801561032357600080fd5b5061032c610dc3565b6040516103399190615467565b60405180910390f35b34801561034e57600080fd5b50610357610e61565b6040516103649190615467565b60405180910390f35b34801561037957600080fd5b50610394600480360361038f9190810190614c6f565b610eff565b6040516103a1919061544c565b60405180910390f35b3480156103b657600080fd5b506103bf6110fd565b6040516103cc9190615467565b60405180910390f35b3480156103e157600080fd5b506103ea61119b565b6040516103f79190615467565b60405180910390f35b34801561040c57600080fd5b50610415611239565b6040516104229190615467565b60405180910390f35b34801561043757600080fd5b506104406112d7565b60405161044d9190615467565b60405180910390f35b34801561046257600080fd5b5061046b611375565b6040516104789190615467565b60405180910390f35b34801561048d57600080fd5b50610496611413565b6040516104a39190615467565b60405180910390f35b3480156104b857600080fd5b506104d360048036036104ce9190810190614c6f565b6114b1565b6040516104e0919061544c565b60405180910390f35b3480156104f557600080fd5b506104fe6116af565b60405161050b9190615172565b60405180910390f35b34801561052057600080fd5b506105296116d9565b6040516105369190615467565b60405180910390f35b34801561054b57600080fd5b5061056660048036036105619190810190614bda565b611777565b604051610573919061544c565b60405180910390f35b34801561058857600080fd5b50610591611972565b60405161059e9190615172565b60405180910390f35b3480156105b357600080fd5b506105ce60048036036105c99190810190614b4c565b611998565b6040516105dd93929190615407565b60405180910390f35b3480156105f257600080fd5b506105fb611a12565b6040516106089190615467565b60405180910390f35b34801561061d57600080fd5b50610626611ab0565b6040516106339190615172565b60405180910390f35b34801561064857600080fd5b50610663600480360361065e9190810190614c1b565b611ad6565b604051610670919061544c565b60405180910390f35b34801561068557600080fd5b5061068e611cf9565b60405161069b9190615467565b60405180910390f35b3480156106b057600080fd5b506106cb60048036036106c69190810190614c1b565b611d97565b6040516106d89190615489565b60405180910390f35b3480156106ed57600080fd5b506106f6611fb9565b60405161070391906155ab565b60405180910390f35b34801561071857600080fd5b50610733600480360361072e9190810190614a31565b611fca565b604051610740919061544c565b60405180910390f35b34801561075557600080fd5b5061075e61200f565b60405161076b9190615467565b60405180910390f35b34801561078057600080fd5b506107896120ad565b6040516107969190615467565b60405180910390f35b3480156107ab57600080fd5b506107c660048036036107c19190810190614b9e565b61214b565b6040516107d593929190615407565b60405180910390f35b3480156107ea57600080fd5b5061080560048036036108009190810190614c6f565b6122aa565b604051610812919061544c565b60405180910390f35b34801561082757600080fd5b50610842600480360361083d9190810190614a80565b6124a8565b60405161084f919061544c565b60405180910390f35b34801561086457600080fd5b5061087f600480360361087a9190810190614cdb565b612613565b60405161088c919061544c565b60405180910390f35b3480156108a157600080fd5b506108aa61284b565b6040516108b79190615172565b60405180910390f35b3480156108cc57600080fd5b506108d5612871565b6040516108e29190615172565b60405180910390f35b3480156108f757600080fd5b50610900612936565b60405161090d9190615467565b60405180910390f35b34801561092257600080fd5b5061092b6129d4565b6040516109389190615467565b60405180910390f35b34801561094d57600080fd5b50610956612a72565b6040516109639190615467565b60405180910390f35b34801561097857600080fd5b50610981612b10565b60405161098e9190615172565b60405180910390f35b3480156109a357600080fd5b506109ac612b36565b6040516109b99190615467565b60405180910390f35b3480156109ce57600080fd5b506109d7612bd4565b6040516109e49190615172565b60405180910390f35b3480156109f957600080fd5b50610a02612bfe565b604051610a0f9190615172565b60405180910390f35b348015610a2457600080fd5b50610a3f6004803603610a3a9190810190614cdb565b612cc3565b604051610a4c919061544c565b60405180910390f35b348015610a6157600080fd5b50610a6a612efb565b604051610a7791906155ab565b60405180910390f35b348015610a8c57600080fd5b50610aa76004803603610aa29190810190614bda565b612f05565b604051610ab49190615489565b60405180910390f35b348015610ac957600080fd5b50610ae46004803603610adf91","90810190614cdb565b613100565b604051610af1919061544c565b60405180910390f35b348015610b0657600080fd5b50610b0f613338565b604051610b1c9190615467565b60405180910390f35b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bbb5780601f10610b9057610100808354040283529160200191610bbb565b820191906000526020600020905b815481529060010190602001808311610b9e57829003601f168201915b505050505081565b600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c595780601f10610c2e57610100808354040283529160200191610c59565b820191906000526020600020905b815481529060010190602001808311610c3c57829003601f168201915b505050505081565b600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610cf75780601f10610ccc57610100808354040283529160200191610cf7565b820191906000526020600020905b815481529060010190602001808311610cda57829003601f168201915b505050505081565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d955780601f10610d6a57610100808354040283529160200191610d95565b820191906000526020600020905b815481529060010190602001808311610d7857829003601f168201915b505050505081565b6000610db560016021546133d690919063ffffffff16565b602181905550602154905090565b60148054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e595780601f10610e2e57610100808354040283529160200191610e59565b820191906000526020600020905b815481529060010190602001808311610e3c57829003601f168201915b505050505081565b60108054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061101160048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ffd5780601f10610fd257610100808354040283529160200191610ffd565b820191906000526020600020905b815481529060010190602001808311610fe057829003601f168201915b50505050508961342d90919063ffffffff16565b6040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161104c949392919061518d565b602060405180830381600087803b15801561106657600080fd5b505af115801561107a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061109e9190810190614b75565b15156110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d69061556b565b60405180910390fd5b6110f58383601b6134419092919063ffffffff16565b905092915050565b60118054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111935780601f1061116857610100808354040283529160200191611193565b820191906000526020600020905b81548152906001019060200180831161117657829003601f168201915b505050505081565b600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112315780601f1061120657610100808354040283529160200191611231565b820191906000526020600020905b81548152906001019060200180831161121457829003601f168201915b505050505081565b60128054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112cf5780601f106112a4576101008083540402835291602001916112cf565b820191906000526020600020905b8154815290600101906020018083116112b257829003601f168201915b505050505081565b60038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561136d5780601f106113425761010080835404028352916020019161136d565b820191906000526020600020905b81548152906001019060200180831161135057829003601f168201915b505050505081565b60028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561140b5780601f106113e05761010080835404028352916020019161140b565b820191906000526020600020905b8154815290600101906020018083116113ee57829003601f168201915b505050505081565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114a95780601f1061147e576101008083540402835291602001916114a9565b820191906000526020600020905b81548152906001019060200180831161148c57829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306115c360048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115af5780601f10611584576101008083540402835291602001916115af565b820191906000526020600020905b81548152906001019060200180831161159257829003601f168201915b50505050508961342d90919063ffffffff16565b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016115fe949392919061518d565b602060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116509190810190614b75565b1515611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061558b565b60405180910390fd5b6116a78383601b61379e9092919063ffffffff16565b905092915050565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561176f5780601f106117445761010080835404028352916020019161176f565b820191906000526020600020905b81548152906001019060200180831161175257829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061188960048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118755780601f1061184a57610100808354040283529160200191611875565b820191906000526020600020905b81548152906001019060200180831161185857829003601f168201915b50505050508861342d90919063ffffffff16565b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016118c4949392919061518d565b602060405180830381600087803b1580156118de57600080fd5b505af11580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119169190810190614b75565b1515611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e9061550b565b60405180910390fd5b61196b82601b61399390919063ffffffff16565b9050919050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608060007f7e608be72e01e9ea5ce4c00590e4939752701f08d8f734e463500db1d323ed66336119c76116af565b306040516119d79392919061529b565b60405180910390a183156119fa576119ef6022613be5565b925092509250611a0b565b611a046025613be5565b9250925092505b9193909250565b600f8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa85780601f10611a7d57610100808354040283529160200191611aa8565b820191906000526020600020905b815481529060010190602001808311611a8b57829003601f168201915b505050505081565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b","60006060600080611af0868461342d90919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630611c0160048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bed5780601f10611bc257610100808354040283529160200191611bed565b820191906000526020600020905b815481529060010190602001808311611bd057829003601f168201915b50505050508b61342d90919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611c3f9594939291906153a5565b6040805180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c909190810190614b10565b8092508193505050801515611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd19061550b565b60405180910390fd5b611cee86601b61399390919063ffffffff16565b935050505092915050565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d8f5780601f10611d6457610100808354040283529160200191611d8f565b820191906000526020600020905b815481529060010190602001808311611d7257829003601f168201915b505050505081565b606080600080611db0868461342d90919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630611ec160038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ead5780601f10611e8257610100808354040283529160200191611ead565b820191906000526020600020905b815481529060010190602001808311611e9057829003601f168201915b50505050508b61342d90919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611eff9594939291906153a5565b6040805180830381600087803b158015611f1857600080fd5b505af1158015611f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f509190810190614b10565b8092508193505050801515611f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f919061552b565b60405180910390fd5b611fae86601b613c1b90919063ffffffff16565b935050505092915050565b6000611fc5601b613d2e565b905090565b60008115611fef57611fe884846022613d3c9092919063ffffffff16565b9050612008565b61200584846025613d3c9092919063ffffffff16565b90505b9392505050565b60138054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120a55780601f1061207a576101008083540402835291602001916120a5565b820191906000526020600020905b81548152906001019060200180831161208857829003601f168201915b505050505081565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121435780601f1061211857610100808354040283529160200191612143565b820191906000526020600020905b81548152906001019060200180831161212657829003601f168201915b505050505081565b60608060006060600080601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef361219b6116af565b30868b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016121d99493929190615345565b6040805180830381600087803b1580156121f257600080fd5b505af1158015612206573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061222a9190810190614b10565b8092508193505050801515612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b906154ab565b60405180910390fd5b871561228f576122846022613be5565b9550955095506122a0565b6122996025613be5565b9550955095505b5050509250925092565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306123bc60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123a85780601f1061237d576101008083540402835291602001916123a8565b820191906000526020600020905b81548152906001019060200180831161238b57829003601f168201915b50505050508961342d90919063ffffffff16565b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016123f7949392919061518d565b602060405180830381600087803b15801561241157600080fd5b505af1158015612425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124499190810190614b75565b151561248a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612481906154cb565b60405180910390fd5b6124a08383601b6140589092919063ffffffff16565b905092915050565b6000806000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef36124f36116af565b3088886040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161253194939291906152e5565b6040805180830381600087803b15801561254a57600080fd5b505af115801561255e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125829190810190614b10565b80925081935050508015156125cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c39061554b565b60405180910390fd5b85156125ef576125e888886022613d3c9092919063ffffffff16565b9250612608565b61260588886025613d3c9092919063ffffffff16565b92505b505095945050505050565b6000606060008061263f86612631898661342d90919063ffffffff16565b61342d90919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061275060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561273c5780601f106127115761010080835404028352916020019161273c565b820191906000526020600020905b81548152906001019060200180831161271f57829003601f168201915b50505050508c61342d90919063ffffffff16565b878a6040518663ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161278e9594939291906153a5565b6040805180830381600087803b1580156127a757600080fd5b505af11580156127bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127df9190810190614b10565b8092508193505050801515612829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128209061558b565b60405180910390fd5b61283f8787601b61379e9092919063ffffffff16565b93505050509392505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3032be86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156128f957600080fd5b505af115801561290d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129319190810190614a08565b905090565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129cc5780601f106129a1576101008083540402835291602001916129cc565b820191906000526020600020905b8154815290600101906020018083116129af57829003601f168201915b505050505081565b60078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a6a5780601f10612a3f57610100808354040283529160200191612a6a565b820191906000526020600020905b815481529060010190602001808311612a4d57829003601f168201915b505050505081565b60008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b085780601f10612add5761010080835404028352916020","0191612b08565b820191906000526020600020905b815481529060010190602001808311612aeb57829003601f168201915b505050505081565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60088054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612bcc5780601f10612ba157610100808354040283529160200191612bcc565b820191906000526020600020905b815481529060010190602001808311612baf57829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55fc52d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612c8657600080fd5b505af1158015612c9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cbe9190810190614a08565b905090565b60006060600080612cef86612ce1898661342d90919063ffffffff16565b61342d90919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630612e0060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612dec5780601f10612dc157610100808354040283529160200191612dec565b820191906000526020600020905b815481529060010190602001808311612dcf57829003601f168201915b50505050508c61342d90919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612e3e9594939291906153a5565b6040805180830381600087803b158015612e5757600080fd5b505af1158015612e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e8f9190810190614b10565b8092508193505050801515612ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed09061556b565b60405180910390fd5b612eef8787601b6134419092919063ffffffff16565b93505050509392505050565b6000602154905090565b6060601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061301760038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130035780601f10612fd857610100808354040283529160200191613003565b820191906000526020600020905b815481529060010190602001808311612fe657829003601f168201915b50505050508861342d90919063ffffffff16565b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613052949392919061518d565b602060405180830381600087803b15801561306c57600080fd5b505af1158015613080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130a49190810190614b75565b15156130e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dc9061552b565b60405180910390fd5b6130f982601b613c1b90919063ffffffff16565b9050919050565b6000606060008061312c8661311e898661342d90919063ffffffff16565b61342d90919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061323d60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132295780601f106131fe57610100808354040283529160200191613229565b820191906000526020600020905b81548152906001019060200180831161320c57829003601f168201915b50505050508c61342d90919063ffffffff16565b878a6040518663ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161327b9594939291906153a5565b6040805180830381600087803b15801561329457600080fd5b505af11580156132a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132cc9190810190614b10565b8092508193505050801515613316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330d906154cb565b60405180910390fd5b61332c8787601b6140589092919063ffffffff16565b93505050509392505050565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133ce5780601f106133a3576101008083540402835291602001916133ce565b820191906000526020600020905b8154815290600101906020018083116133b157829003601f168201915b505050505081565b6000808284019050838110151515613423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341a906154eb565b60405180910390fd5b8091505092915050565b60606134398383614255565b905092915050565b60008084600001846040518082805190602001908083835b60208310151561347e5780518252602082019150602081019050602083039250613459565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115613631577f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b602083101515613554578051825260208201915060208101905060208303925061352f565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010160405161359b959493929190615233565b60405180910390a18285600001856040518082805190602001908083835b6020831015156135de57805182526020820191506020810190506020830392506135b9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010190805190602001906136279291906146f0565b5060019150613796565b8285600001856040518082805190602001908083835b60208310151561366c5780518252602082019150602081019050602083039250613647565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010190805190602001906136b59291906146f0565b508460010180548091906001016136cc9190614770565b90506001810185600001856040518082805190602001908083835b60208310151561370c57805182526020820191506020810190506020830392506136e7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000018190555083856001018281548110151561375857fe5b9060005260206000209060020201600001908051906020019061377c9291906146f0565b508460020160008154809291906001019190505550600091505b509392505050565b60008084600001846040518082805190602001908083835b6020831015156137db57805182526020820191506020810190506020830392506137b6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115613826576000915061398b565b8285600001856040518082805190602001908083835b602083101515613861578051825260208201915060208101905060208303925061383c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010190805190602001906138aa9291906146f0565b508460010180548091906001016138c19190614770565b90506001810185600001856040518082805190602001908083835b60208310151561390157805182526020820191506020810190506020830392506138dc565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000018190555083856001018281548110151561394d57fe5b906000526020600020906002020160000190805190602001906139719291906146f0565b508460020160008154809291906001019190505550600191505b509392505050565b60008083600001836040518082805190602001908083835b6020831015156139d057805182526020820191506020810190506020830392506139ab565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811415613a1b5760009150613bde565b7f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f44454c45544500000000000000000000000000000000000000000000000000008152508688600001886040518082805190602001908083835b602083101515613aaf5780518252602082019150602081019050602083039250613a8a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081","526020016040518091039020600101604051613af6959493929190615233565b60405180910390a183600001836040518082805190602001908083835b602083101515613b385780518252602082019150602081019050602083039250613b13565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600080820160009055600182016000613b8491906147a2565b505060018460010160018303815481101515613b9c57fe5b906000526020600020906002020160010160006101000a81548160ff021916908315150217905550836002016000815480929190600190039190505550600191505b5092915050565b60608060008060009050613c03856000613bfe88614426565b614434565b80945081955082965083975050505050509193909250565b606082600001826040518082805190602001908083835b602083101515613c575780518252602082019150602081019050602083039250613c32565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613d215780601f10613cf657610100808354040283529160200191613d21565b820191906000526020600020905b815481529060010190602001808311613d0457829003601f168201915b5050505050905092915050565b600081600201549050919050565b6000808460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000811115613ef3577fffb3b92926372308a3c1a7038f2528360e1585c2135e601c62d850c778e62f7032336040805190810160405280600681526020017f4d4f444946590000000000000000000000000000000000000000000000000000815250878960000160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051613e5f9594939291906151d9565b60405180910390a1828560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019150614050565b828560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550846001018054809190600101613f8c91906147ea565b9050600181018560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550838560010182815481101515613fec57fe5b9060005260206000200160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460020160008154809291906001019190505550600091505b509392505050565b60008084600001846040518082805190602001908083835b6020831015156140955780518252602082019150602081019050602083039250614070565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115614248577f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151561416b5780518252602082019150602081019050602083039250614146565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516141b2959493929190615233565b60405180910390a18285600001856040518082805190602001908083835b6020831015156141f557805182526020820191506020810190506020830392506141d0565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019061423e9291906146f0565b506001915061424d565b600091505b509392505050565b606080606080606060008088955087945084518651016040519080825280601f01601f19166020018201604052801561429d5781602001602082028038833980820191505090505b50935083925060009150600090505b855181101561435f5785818151811015156142c357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561432257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506142ac565b600090505b845181101561441757848181518110151561437b57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156143da57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050614364565b83965050505050505092915050565b600081600201549050919050565b6060806000806000806000808860405190808252806020026020018201604052801561446f5781602001602082028038833980820191505090505b509750886040519080825280602002602001820160405280156144a15781602001602082028038833980820191505090505b509650600093506000925060009550600094508993505b6144c28b856145c6565b156145b9576144d18b856145da565b915091508188848151811015156144e457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080878481518110151561452f57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600183019250858060010196505088861015156145a85761458c8b8561468c565b94506145988b866145c6565b15156145a357600094505b6145b9565b6145b28b8561468c565b93506144b8565b5050505093509350935093565b600082600101805490508210905092915050565b60008083600101838154811015156145ee57fe5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508360000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690509250929050565b600081806001019250505b8260010180549050821080156146d5575082600101828154811015156146b957fe5b9060005260206000200160000160149054906101000a900460ff165b156146e7578180600101925050614697565b81905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061473157805160ff191683800117855561475f565b8280016001018555821561475f579182015b8281111561475e578251825591602001919060010190614743565b5b50905061476c9190614816565b5090565b81548183558181111561479d5760020281600202836000526020600020918201910161479c919061483b565b5b505050565b50805460018160011615610100020316600290046000825580601f106147c857506147e7565b601f0160209004906000526020600020908101906147e69190614816565b5b50565b81548183558181111561481157818360005260206000209182019101614810919061487e565b5b505050565b61483891905b8082111561483457600081600090555060010161481c565b5090565b90565b61487b91905b80821115614877576000808201600061485a91906147a2565b6001820160006101000a81549060ff021916905550600201614841565b5090565b90565b6148d591905b808211156148d157600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905550600101614884565b5090565b90565b60006148e482356156f0565b905092915050565b60006148f882516156f0565b905092915050565b600082601f830112151561491357600080fd5b6004614926614921826155f3565b6155c6565b9150818385602084028201111561493c57600080fd5b60005b8381101561496c5781614952888261499e565b84526020840193506020830192505060018101905061493f565b5050505092915050565b60006149828235615710565b905092915050565b60006149968251615710565b905092915050565b60006149aa823561571c565b905092915050565b600082601f83011215156149c557600080fd5b81356149d86149d382615615565b6155c6565b915080825260208301602083018583830111156149f457600080fd5b6149ff83828461574a565b50505092915050565b600060208284031215614a1a57600080fd5b6000614a28848285016148ec565b91505092915050565b600080600060608486031215614a4657600080fd5b6000614a54868287016148d8565b9350506020614a65868287016148d8565b9250506040614a7686828701614976565b9150509250925092565b60008060008060006101008688031215614a9957600080fd5b6000614aa7888289016148d8565b9550506020614ab8888289016148d8565b9450506040614ac988828901614976565b935050606086013567ffffffff","ffffffff811115614ae657600080fd5b614af2888289016149b2565b9250506080614b0388828901614900565b9150509295509295909350565b60008060408385031215614b2357600080fd5b6000614b31858286016148ec565b9250506020614b428582860161498a565b9150509250929050565b600060208284031215614b5e57600080fd5b6000614b6c84828501614976565b91505092915050565b600060208284031215614b8757600080fd5b6000614b958482850161498a565b91505092915050565b60008060a08385031215614bb157600080fd5b6000614bbf85828601614976565b9250506020614bd085828601614900565b9150509250929050565b600060208284031215614bec57600080fd5b600082013567ffffffffffffffff811115614c0657600080fd5b614c12848285016149b2565b91505092915050565b60008060a08385031215614c2e57600080fd5b600083013567ffffffffffffffff811115614c4857600080fd5b614c54858286016149b2565b9250506020614c6585828601614900565b9150509250929050565b60008060408385031215614c8257600080fd5b600083013567ffffffffffffffff811115614c9c57600080fd5b614ca8858286016149b2565b925050602083013567ffffffffffffffff811115614cc557600080fd5b614cd1858286016149b2565b9150509250929050565b600080600060c08486031215614cf057600080fd5b600084013567ffffffffffffffff811115614d0a57600080fd5b614d16868287016149b2565b935050602084013567ffffffffffffffff811115614d3357600080fd5b614d3f868287016149b2565b9250506040614d5086828701614900565b9150509250925092565b614d63816156b0565b82525050565b6000614d748261566a565b808452602084019350614d8683615641565b60005b82811015614db857614d9c868351614d5a565b614da582615696565b9150602086019550600181019050614d89565b50849250505092915050565b614dcd81615675565b614dd68261564e565b60005b82811015614e0857614dec858351614e1e565b614df5826156a3565b9150602085019450600181019050614dd9565b5050505050565b614e18816156d0565b82525050565b614e27816156dc565b82525050565b6000614e388261568b565b808452614e4c816020860160208601615759565b614e558161578c565b602085010191505092915050565b6000614e6e82615680565b808452614e82816020860160208601615759565b614e8b8161578c565b602085010191505092915050565b600081546001811660008114614eb65760018114614ed657614f17565b607f600283041680865260ff198316602087015260408601935050614f17565b60028204808652602086019550614eec85615658565b60005b82811015614f0e57815481890152600182019150602081019050614eef565b80880195505050505b505092915050565b614f2881615726565b82525050565b614f3781615738565b82525050565b6000601782527f676574416c6c41737365747320466f7262696464656e210000000000000000006020830152604082019050919050565b6000600e82527f73657420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000601b82527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006020830152604082019050919050565b6000601182527f72656d6f766520466f7262696464656e210000000000000000000000000000006020830152604082019050919050565b6000600e82527f67657420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000601382527f616464417373657420466f7262696464656e21000000000000000000000000006020830152604082019050919050565b6000601182527f696e7365727420466f7262696464656e210000000000000000000000000000006020830152604082019050919050565b6000600882527f61646441737365740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600e82527f61646420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000600c82527f676574416c6c41737365747300000000000000000000000000000000000000006020830152604082019050919050565b61516c816156e6565b82525050565b60006020820190506151876000830184614d5a565b92915050565b60006080820190506151a26000830187614d5a565b6151af6020830186614d5a565b6151bc6040830185614d5a565b81810360608301526151ce8184614e2d565b905095945050505050565b600060a0820190506151ee6000830188614d5a565b6151fb6020830187614d5a565b818103604083015261520d8186614e63565b905061521c6060830185614d5a565b6152296080830184614d5a565b9695505050505050565b600060a0820190506152486000830188614d5a565b6152556020830187614d5a565b81810360408301526152678186614e63565b9050818103606083015261527b8185614e2d565b9050818103608083015261528f8184614e99565b90509695505050505050565b60006080820190506152b06000830186614d5a565b6152bd6020830185614d5a565b6152ca6040830184614f1f565b81810360608301526152db8161512c565b9050949350505050565b6000610100820190506152fb6000830187614d5a565b6153086020830186614f1f565b8181036040830152615319816150be565b9050818103606083015261532d8185614e2d565b905061533c6080830184614dc4565b95945050505050565b60006101008201905061535b6000830187614d5a565b6153686020830186614f1f565b81810360408301526153798161512c565b9050818103606083015261538d8185614e2d565b905061539c6080830184614dc4565b95945050505050565b6000610100820190506153bb6000830188614d5a565b6153c86020830187614f2e565b81810360408301526153da8186614e2d565b905081810360608301526153ee8185614e2d565b90506153fd6080830184614dc4565b9695505050505050565b600060608201905081810360008301526154218186614d69565b905081810360208301526154358185614d69565b90506154446040830184615163565b949350505050565b60006020820190506154616000830184614e0f565b92915050565b600060208201905081810360008301526154818184614e63565b905092915050565b600060208201905081810360008301526154a38184614e2d565b905092915050565b600060208201905081810360008301526154c481614f3d565b9050919050565b600060208201905081810360008301526154e481614f74565b9050919050565b6000602082019050818103600083015261550481614fab565b9050919050565b6000602082019050818103600083015261552481614fe2565b9050919050565b6000602082019050818103600083015261554481615019565b9050919050565b6000602082019050818103600083015261556481615050565b9050919050565b6000602082019050818103600083015261558481615087565b9050919050565b600060208201905081810360008301526155a4816150f5565b9050919050565b60006020820190506155c06000830184615163565b92915050565b6000604051905081810181811067ffffffffffffffff821117156155e957600080fd5b8060405250919050565b600067ffffffffffffffff82111561560a57600080fd5b602082029050919050565b600067ffffffffffffffff82111561562c57600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b6000819050919050565b60008160005260206000209050919050565b600081519050919050565b600060049050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000615731826156b0565b9050919050565b6000615743826156b0565b9050919050565b82818337600083830152505050565b60005b8381101561577757808201518184015260208101905061575c565b83811115615786576000848401525b50505050565b6000601f19601f8301169050919050565b6060600080836c0100000000000000000000000002915060146040519080825280601f01601f1916602001820160405280156157e85781602001602082028038833980820191505090505b509250600090505b601481101561587557818160148110151561580757fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002838281518110151561583857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506157f0565b50509190505600a265627a7a72305820c11c0580bcaa88f48a77d6271337b79c626b75cf694301b434f1d0029505f7916c6578706572696d656e74616cf50037"};

    public static final String BINARY = String.join("", BINARY_ARRAY);

    public static final String[] SM_BINARY_ARRAY = {"60806040526040805190810160405280600681526020017f7075626c6963000000000000000000000000000000000000000000000000000081525060009080519060200190620000519291906200105f565b506040805190810160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f9291906200105f565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060029080519060200190620000ed9291906200105f565b506040805190810160405280600281526020017f5f72000000000000000000000000000000000000000000000000000000000000815250600390805190602001906200013b9291906200105f565b506040805190810160405280600281526020017f5f7700000000000000000000000000000000000000000000000000000000000081525060049080519060200190620001899291906200105f565b506040805190810160405280600381526020017f616c6c000000000000000000000000000000000000000000000000000000000081525060059080519060200190620001d79291906200105f565b506040805190810160405280600281526020017f696400000000000000000000000000000000000000000000000000000000000081525060069080519060200190620002259291906200105f565b506040805190810160405280600481526020017f616464720000000000000000000000000000000000000000000000000000000081525060079080519060200190620002739291906200105f565b506040805190810160405280600481526020017f747970650000000000000000000000000000000000000000000000000000000081525060089080519060200190620002c19291906200105f565b506040805190810160405280600481526020017f726f6c6500000000000000000000000000000000000000000000000000000000815250600990805190602001906200030f9291906200105f565b506040805190810160405280600781526020017f7075625f6b657900000000000000000000000000000000000000000000000000815250600a90805190602001906200035d9291906200105f565b506040805190810160405280600481526020017f6461746100000000000000000000000000000000000000000000000000000000815250600b9080519060200190620003ab9291906200105f565b506040805190810160405280600681526020017f726f6c655f720000000000000000000000000000000000000000000000000000815250600c9080519060200190620003f99291906200105f565b506040805190810160405280600681526020017f726f6c655f770000000000000000000000000000000000000000000000000000815250600d9080519060200190620004479291906200105f565b506040805190810160405280600c81526020017f6f70656e696e675f62616e6b0000000000000000000000000000000000000000815250600e9080519060200190620004959291906200105f565b506040805190810160405280600681526020017f6173736574730000000000000000000000000000000000000000000000000000815250600f9080519060200190620004e39291906200105f565b506040805190810160405280600781526020017f62616c616e63650000000000000000000000000000000000000000000000000081525060109080519060200190620005319291906200105f565b506040805190810160405280600681526020017f7265636f72640000000000000000000000000000000000000000000000000000815250601190805190602001906200057f9291906200105f565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060129080519060200190620005cd9291906200105f565b506040805190810160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250601390805190602001906200061b9291906200105f565b506040805190810160405280600581526020017f6f776e657200000000000000000000000000000000000000000000000000000081525060149080519060200190620006699291906200105f565b506040805190810160405280600481526020017f757365720000000000000000000000000000000000000000000000000000000081525060159080519060200190620006b79291906200105f565b5062010001601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010002601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010003601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010004601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620007d557600080fd5b5060405160408062006ddf8339810180604052620007f79190810190620012a0565b81816060620008303073ffffffffffffffffffffffffffffffffffffffff1662000c07640100000000026200579d176401000000009004565b9050620008f660068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620008d05780601f10620008a457610100808354040283529160200191620008d0565b820191906000526020600020905b815481529060010190602001808311620008b257829003601f168201915b505050505082601b62000ceb640100000000026200375117909291906401000000009004565b5082601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e92139da6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620009bf57600080fd5b505af1158015620009d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620009fa919081019062001274565b601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631500025a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000ac157600080fd5b505af115801562000ad6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000afc919081019062001274565b602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151562000bba5781601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000bfc565b30601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050505062001519565b6060600080836c0100000000000000000000000002915060146040519080825280601f01601f19166020018201604052801562000c535781602001602082028038833980820191505090505b509250600090505b601481101562000ce457818160148110151562000c7457fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002838281518110151562000ca657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505062000c5b565b5050919050565b60008084600001846040518082805190602001908083835b60208310151562000d2a578051825260208201915060208101905060208303925062000d03565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001549050600081111562000ee7577fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151562000e03578051825260208201915060208101905060208303925062000ddc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010160405162000e4c959493929190620013f8565b60405180910390a18285600001856040518082805190602001908083835b60208310151562000e91578051825260208201915060208101905060208303925062000e6a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000edc929190620010e6565b506001915062001057565b8285600001856040518082805190602001908083835b60208310151562000f24578051825260208201915060208101905060208303925062000efd565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000f6f929190620010e6565b5084600101805480919060010162000f8891906200116d565b90506001810185600001856040518082805190602001908083835b60208310151562000fca578051825260208201915060208101905060208303925062000fa3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000","01819055508385600101828154811015156200101757fe5b906000526020600020906002020160000190805190602001906200103d929190620010e6565b508460020160008154809291906001019190505550600091505b509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620010a257805160ff1916838001178555620010d3565b82800160010185558215620010d3579182015b82811115620010d2578251825591602001919060010190620010b5565b5b509050620010e29190620011a2565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200112957805160ff19168380011785556200115a565b828001600101855582156200115a579182015b82811115620011595782518255916020019190600101906200113c565b5b509050620011699190620011a2565b5090565b8154818355818111156200119d576002028160020283600052602060002091820191016200119c9190620011ca565b5b505050565b620011c791905b80821115620011c3576000816000905550600101620011a9565b5090565b90565b6200120f91905b808211156200120b5760008082016000620011ed919062001212565b6001820160006101000a81549060ff021916905550600201620011d1565b5090565b90565b50805460018160011615610100020316600290046000825580601f106200123a57506200125b565b601f0160209004906000526020600020908101906200125a9190620011a2565b5b50565b60006200126c8251620014b2565b905092915050565b6000602082840312156200128757600080fd5b600062001297848285016200125e565b91505092915050565b60008060408385031215620012b457600080fd5b6000620012c4858286016200125e565b9250506020620012d7858286016200125e565b9150509250929050565b620012ec8162001492565b82525050565b6000620012ff8262001487565b80845262001315816020860160208601620014d2565b620013208162001508565b602085010191505092915050565b60006200133b826200147c565b80845262001351816020860160208601620014d2565b6200135c8162001508565b602085010191505092915050565b6000815460018116600081146200138a5760018114620013ab57620013f0565b607f600283041680865260ff198316602087015260408601935050620013f0565b60028204808652602086019550620013c3856200146a565b60005b82811015620013e757815481890152600182019150602081019050620013c6565b80880195505050505b505092915050565b600060a0820190506200140f6000830188620012e1565b6200141e6020830187620012e1565b81810360408301526200143281866200132e565b90508181036060830152620014488185620012f2565b905081810360808301526200145e81846200136a565b90509695505050505050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620014f2578082015181840152602081019050620014d5565b8381111562001502576000848401525b50505050565b6000601f19601f8301169050919050565b6158b680620015296000396000f30060806040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630bc95c79146102405780630c9481b91461026b578063112da303146102965780631500025a146102c15780631a1f1cd2146102ec5780633055ae811461031757806342033801146103545780634425c4261461037f57806347a6caff146103aa57806351cf7708146103e757806356688fa214610424578063567f2836146104635780635c7540bc1461048e5780635edfd6fa146104b95780635f12ec2e146104e457806361e020cb1461050f57806367e09af51461054c57806374b00d5314610577578063769fe342146105a25780637e3a1ef4146105cd5780637e6f287c146105f85780637f00af97146106355780638a4451f5146106605780638ed13ef51461068b57806398068364146106c8578063a4fd7711146106f3578063a8cced2014610730578063ad07c37a1461076d578063afe5e5a6146107aa578063b09a50fe146107e9578063b32941d814610814578063bcc6cdb61461083f578063bced95351461086a578063bfabb86d14610895578063c03fd5e7146108c0578063c6125d0c146108eb578063cfc742d514610916578063d1281a7814610953578063d3e9af5a1461097e578063d617f06d146109a9578063d7e7948f146109d4578063e3fbfc3f146109ff578063e92139da14610a3c578063ece272e314610a67578063ee19b0cf14610a92578063f6cb4bc514610abd578063f976699414610ae8575b600080fd5b34801561024c57600080fd5b50610255610b25565b6040516102629190615172565b60405180910390f35b34801561027757600080fd5b50610280610b4b565b60405161028d9190615467565b60405180910390f35b3480156102a257600080fd5b506102ab610be9565b6040516102b89190615467565b60405180910390f35b3480156102cd57600080fd5b506102d6610c87565b6040516102e39190615172565b60405180910390f35b3480156102f857600080fd5b50610301610d4c565b60405161030e9190615467565b60405180910390f35b34801561032357600080fd5b5061033e60048036036103399190810190614bda565b610dea565b60405161034b9190615489565b60405180910390f35b34801561036057600080fd5b50610369610fe5565b6040516103769190615467565b60405180910390f35b34801561038b57600080fd5b50610394611083565b6040516103a191906155ab565b60405180910390f35b3480156103b657600080fd5b506103d160048036036103cc9190810190614cdb565b6110a9565b6040516103de919061544c565b60405180910390f35b3480156103f357600080fd5b5061040e60048036036104099190810190614cdb565b6112e1565b60405161041b919061544c565b60405180910390f35b34801561043057600080fd5b5061044b60048036036104469190810190614b4c565b611519565b60405161045a93929190615407565b60405180910390f35b34801561046f57600080fd5b50610478611593565b60405161048591906155ab565b60405180910390f35b34801561049a57600080fd5b506104a361159d565b6040516104b09190615172565b60405180910390f35b3480156104c557600080fd5b506104ce6115c7565b6040516104db9190615467565b60405180910390f35b3480156104f057600080fd5b506104f9611665565b6040516105069190615172565b60405180910390f35b34801561051b57600080fd5b5061053660048036036105319190810190614c6f565b61168f565b604051610543919061544c565b60405180910390f35b34801561055857600080fd5b5061056161188d565b60405161056e9190615467565b60405180910390f35b34801561058357600080fd5b5061058c61192b565b6040516105999190615172565b60405180910390f35b3480156105ae57600080fd5b506105b7611951565b6040516105c49190615467565b60405180910390f35b3480156105d957600080fd5b506105e26119ef565b6040516105ef9190615467565b60405180910390f35b34801561060457600080fd5b5061061f600480360361061a9190810190614bda565b611a8d565b60405161062c919061544c565b60405180910390f35b34801561064157600080fd5b5061064a611c88565b6040516106579190615467565b60405180910390f35b34801561066c57600080fd5b50610675611d26565b6040516106829190615172565b60405180910390f35b34801561069757600080fd5b506106b260048036036106ad9190810190614cdb565b611d4c565b6040516106bf919061544c565b60405180910390f35b3480156106d457600080fd5b506106dd611f84565b6040516106ea9190615467565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036036107159190810190614c6f565b612022565b604051610727919061544c565b60405180910390f35b34801561073c57600080fd5b5061075760048036036107529190810190614a31565b612220565b604051610764919061544c565b60405180910390f35b34801561077957600080fd5b50610794600480360361078f9190810190614c6f565b612265565b6040516107a1919061544c565b60405180910390f35b3480156107b657600080fd5b506107d160048036036107cc9190810190614b9e565b612463565b6040516107e093929190615407565b60405180910390f35b3480156107f557600080fd5b506107fe6125c2565b60405161080b9190615467565b60405180910390f35b34801561082057600080fd5b50610829612660565b6040516108369190615467565b60405180910390f35b34801561084b57600080fd5b506108546126fe565b6040516108619190615467565b60405180910390f35b34801561087657600080fd5b5061087f61279c565b60405161088c9190615467565b60405180910390f35b3480156108a157600080fd5b506108aa61283a565b6040516108b79190615467565b60405180910390f35b3480156108cc57600080fd5b506108d56128d8565b6040516108e29190615172565b60405180910390f35b3480156108f757600080fd5b506109006128fe565b60405161090d9190615467565b60405180910390f35b34801561092257600080fd5b5061093d60048036036109389190810190614a80565b61299c565b60405161094a919061544c565b60405180910390f35b34801561095f57600080fd5b50610968612b07565b6040516109759190615467565b60405180910390f35b34801561098a57600080fd5b50610993612ba5565b6040516109a091906155ab565b60405180910390f35b3480156109b557600080fd5b506109be612bb6565b6040516109cb9190615467565b60405180910390f35b3480156109e057600080fd5b506109e9612c54565b6040516109f69190615467565b60405180910390f35b348015610a0b57600080fd5b50610a266004803603610a219190810190614c1b565b612cf2565b604051610a33919061544c565b60405180910390f35b348015610a4857600080fd5b50610a51612f15565b604051610a5e9190615172565b60405180910390f35b348015610a7357600080fd5b50610a7c612fda565b604051610a899190615467565b60405180910390f35b348015610a9e57600080fd5b50610aa7613078565b604051610ab49190615467565b60405180910390f35b348015610ac957600080fd5b50610ad2613116565b60405161","0adf9190615467565b60405180910390f35b348015610af457600080fd5b50610b0f6004803603610b0a9190810190614c1b565b6131b4565b604051610b1c9190615489565b60405180910390f35b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610be15780601f10610bb657610100808354040283529160200191610be1565b820191906000526020600020905b815481529060010190602001808311610bc457829003601f168201915b505050505081565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c7f5780601f10610c5457610100808354040283529160200191610c7f565b820191906000526020600020905b815481529060010190602001808311610c6257829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631500025a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610d0f57600080fd5b505af1158015610d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d479190810190614a08565b905090565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610de25780601f10610db757610100808354040283529160200191610de2565b820191906000526020600020905b815481529060010190602001808311610dc557829003601f168201915b505050505081565b6060601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630610efc60038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ee85780601f10610ebd57610100808354040283529160200191610ee8565b820191906000526020600020905b815481529060010190602001808311610ecb57829003601f168201915b5050505050886133d690919063ffffffff16565b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610f37949392919061518d565b602060405180830381600087803b158015610f5157600080fd5b505af1158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f899190810190614b75565b1515610fca576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401610fc19061550b565b60405180910390fd5b610fde82601b6133ea90919063ffffffff16565b9050919050565b60138054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561107b5780601f106110505761010080835404028352916020019161107b565b820191906000526020600020905b81548152906001019060200180831161105e57829003601f168201915b505050505081565b600061109b60016021546134fd90919063ffffffff16565b602181905550602154905090565b600060606000806110d5866110c789866133d690919063ffffffff16565b6133d690919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306111e660048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111d25780601f106111a7576101008083540402835291602001916111d2565b820191906000526020600020905b8154815290600101906020018083116111b557829003601f168201915b50505050508c6133d690919063ffffffff16565b878a6040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016112249594939291906153a5565b6040805180830381600087803b15801561123d57600080fd5b505af1158015611251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112759190810190614b10565b80925081935050508015156112bf576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016112b69061552b565b60405180910390fd5b6112d58787601b6135549092919063ffffffff16565b93505050509392505050565b6000606060008061130d866112ff89866133d690919063ffffffff16565b6133d690919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061141e60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561140a5780601f106113df5761010080835404028352916020019161140a565b820191906000526020600020905b8154815290600101906020018083116113ed57829003601f168201915b50505050508c6133d690919063ffffffff16565b878a6040518663ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161145c9594939291906153a5565b6040805180830381600087803b15801561147557600080fd5b505af1158015611489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114ad9190810190614b10565b80925081935050508015156114f7576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016114ee9061556b565b60405180910390fd5b61150d8787601b6137519092919063ffffffff16565b93505050509392505050565b60608060007ff2b3d6f00be579b67419fa36ef89b4d8bb8cf9877e7c4ec33bcd52f165fe7ddb33611548611665565b306040516115589392919061529b565b60405180910390a1831561157b576115706022613aae565b92509250925061158c565b6115856025613aae565b9250925092505b9193909250565b6000602154905090565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561165d5780601f106116325761010080835404028352916020019161165d565b820191906000526020600020905b81548152906001019060200180831161164057829003601f168201915b505050505081565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306117a160048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561178d5780601f106117625761010080835404028352916020019161178d565b820191906000526020600020905b81548152906001019060200180831161177057829003601f168201915b5050505050896133d690919063ffffffff16565b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016117dc949392919061518d565b602060405180830381600087803b1580156117f657600080fd5b505af115801561180a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061182e9190810190614b75565b151561186f576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016118669061556b565b60405180910390fd5b6118858383601b6137519092919063ffffffff16565b905092915050565b600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119235780601f106118f857610100808354040283529160200191611923565b820191906000526020600020905b81548152906001019060200180831161190657829003601f168201915b505050505081565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119e75780601f106119bc576101008083540402835291602001916119e7565b820191906000526020600020905b8154815290600101906020018083116119ca57829003601f168201915b505050505081565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a855780601f10611a5a57610100808354040283529160200191611a85565b820191906000526020600020905b815481529060010190602001808311611a6857829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a600090549061","01000a900473ffffffffffffffffffffffffffffffffffffffff1630611b9f60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b8b5780601f10611b6057610100808354040283529160200191611b8b565b820191906000526020600020905b815481529060010190602001808311611b6e57829003601f168201915b5050505050886133d690919063ffffffff16565b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611bda949392919061518d565b602060405180830381600087803b158015611bf457600080fd5b505af1158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c2c9190810190614b75565b1515611c6d576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401611c649061558b565b60405180910390fd5b611c8182601b613ae490919063ffffffff16565b9050919050565b60088054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d1e5780601f10611cf357610100808354040283529160200191611d1e565b820191906000526020600020905b815481529060010190602001808311611d0157829003601f168201915b505050505081565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060600080611d7886611d6a89866133d690919063ffffffff16565b6133d690919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630611e8960048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e755780601f10611e4a57610100808354040283529160200191611e75565b820191906000526020600020905b815481529060010190602001808311611e5857829003601f168201915b50505050508c6133d690919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611ec79594939291906153a5565b6040805180830381600087803b158015611ee057600080fd5b505af1158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f189190810190614b10565b8092508193505050801515611f62576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401611f59906154cb565b60405180910390fd5b611f788787601b613d369092919063ffffffff16565b93505050509392505050565b60078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561201a5780601f10611fef5761010080835404028352916020019161201a565b820191906000526020600020905b815481529060010190602001808311611ffd57829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061213460048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121205780601f106120f557610100808354040283529160200191612120565b820191906000526020600020905b81548152906001019060200180831161210357829003601f168201915b5050505050896133d690919063ffffffff16565b6040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161216f949392919061518d565b602060405180830381600087803b15801561218957600080fd5b505af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121c19190810190614b75565b1515612202576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016121f9906154cb565b60405180910390fd5b6122188383601b613d369092919063ffffffff16565b905092915050565b600081156122455761223e84846022613f2b9092919063ffffffff16565b905061225e565b61225b84846025613f2b9092919063ffffffff16565b90505b9392505050565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061237760048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123635780601f1061233857610100808354040283529160200191612363565b820191906000526020600020905b81548152906001019060200180831161234657829003601f168201915b5050505050896133d690919063ffffffff16565b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016123b2949392919061518d565b602060405180830381600087803b1580156123cc57600080fd5b505af11580156123e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124049190810190614b75565b1515612445576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161243c9061552b565b60405180910390fd5b61245b8383601b6135549092919063ffffffff16565b905092915050565b60608060006060600080601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b1256124b3611665565b30868b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016124f19493929190615345565b6040805180830381600087803b15801561250a57600080fd5b505af115801561251e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125429190810190614b10565b809250819350505080151561258c576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401612583906154ab565b60405180910390fd5b87156125a75761259c6022613aae565b9550955095506125b8565b6125b16025613aae565b9550955095505b5050509250925092565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126585780601f1061262d57610100808354040283529160200191612658565b820191906000526020600020905b81548152906001019060200180831161263b57829003601f168201915b505050505081565b60148054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126f65780601f106126cb576101008083540402835291602001916126f6565b820191906000526020600020905b8154815290600101906020018083116126d957829003601f168201915b505050505081565b60128054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127945780601f1061276957610100808354040283529160200191612794565b820191906000526020600020905b81548152906001019060200180831161277757829003601f168201915b505050505081565b60118054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128325780601f1061280757610100808354040283529160200191612832565b820191906000526020600020905b81548152906001019060200180831161281557829003601f168201915b505050505081565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128d05780601f106128a5576101008083540402835291602001916128d0565b820191906000526020600020905b8154815290600101906020018083116128b357829003601f168201915b505050505081565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129945780601f1061296957610100808354040283529160200191612994565b820191906000526020600020905b81548152906001019060200180831161297757829003601f168201915b505050505081565b6000806000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b1256129e7611665565b3088886040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612a2594939291906152e5565b6040805180830381600087803b158015612a3e57600080fd5b505af1158015612a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a769190810190614b10565b8092508193505050801515612ac0576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401612ab79061554b565b60405180910390fd5b8515612ae357612adc88886022613f2b9092919063ff","ffffff16565b9250612afc565b612af988886025613f2b9092919063ffffffff16565b92505b505095945050505050565b60038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b9d5780601f10612b7257610100808354040283529160200191612b9d565b820191906000526020600020905b815481529060010190602001808311612b8057829003601f168201915b505050505081565b6000612bb1601b614247565b905090565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c4c5780601f10612c2157610100808354040283529160200191612c4c565b820191906000526020600020905b815481529060010190602001808311612c2f57829003601f168201915b505050505081565b60108054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cea5780601f10612cbf57610100808354040283529160200191612cea565b820191906000526020600020905b815481529060010190602001808311612ccd57829003601f168201915b505050505081565b60006060600080612d0c86846133d690919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630612e1d60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e095780601f10612dde57610100808354040283529160200191612e09565b820191906000526020600020905b815481529060010190602001808311612dec57829003601f168201915b50505050508b6133d690919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612e5b9594939291906153a5565b6040805180830381600087803b158015612e7457600080fd5b505af1158015612e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612eac9190810190614b10565b8092508193505050801515612ef6576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401612eed9061558b565b60405180910390fd5b612f0a86601b613ae490919063ffffffff16565b935050505092915050565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e92139da6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612f9d57600080fd5b505af1158015612fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612fd59190810190614a08565b905090565b600f8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130705780601f1061304557610100808354040283529160200191613070565b820191906000526020600020905b81548152906001019060200180831161305357829003601f168201915b505050505081565b60008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561310e5780601f106130e35761010080835404028352916020019161310e565b820191906000526020600020905b8154815290600101906020018083116130f157829003601f168201915b505050505081565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131ac5780601f10613181576101008083540402835291602001916131ac565b820191906000526020600020905b81548152906001019060200180831161318f57829003601f168201915b505050505081565b6060806000806131cd86846133d690919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306132de60038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132ca5780601f1061329f576101008083540402835291602001916132ca565b820191906000526020600020905b8154815290600101906020018083116132ad57829003601f168201915b50505050508b6133d690919063ffffffff16565b878a6040518663ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161331c9594939291906153a5565b6040805180830381600087803b15801561333557600080fd5b505af1158015613349573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061336d9190810190614b10565b80925081935050508015156133b7576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016133ae9061550b565b60405180910390fd5b6133cb86601b6133ea90919063ffffffff16565b935050505092915050565b60606133e28383614255565b905092915050565b606082600001826040518082805190602001908083835b6020831015156134265780518252602082019150602081019050602083039250613401565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156134f05780601f106134c5576101008083540402835291602001916134f0565b820191906000526020600020905b8154815290600101906020018083116134d357829003601f168201915b5050505050905092915050565b600080828401905083811015151561354a576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401613541906154eb565b60405180910390fd5b8091505092915050565b60008084600001846040518082805190602001908083835b602083101515613591578051825260208201915060208101905060208303925061356c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115613744577fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b6020831015156136675780518252602082019150602081019050602083039250613642565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516136ae959493929190615233565b60405180910390a18285600001856040518082805190602001908083835b6020831015156136f157805182526020820191506020810190506020830392506136cc565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019061373a9291906146f0565b5060019150613749565b600091505b509392505050565b60008084600001846040518082805190602001908083835b60208310151561378e5780518252602082019150602081019050602083039250613769565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115613941577fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b602083101515613864578051825260208201915060208101905060208303925061383f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516138ab959493929190615233565b60405180910390a18285600001856040518082805190602001908083835b6020831015156138ee57805182526020820191506020810190506020830392506138c9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010190805190602001906139379291906146f0565b5060019150613aa6565b8285600001856040518082805190602001908083835b60208310151561397c5780518252602082019150602081019050602083039250613957565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010190805190602001906139c59291906146f0565b508460010180548091906001016139dc9190614770565b90506001810185600001856040518082805190602001908083835b602083101515613a1c57805182526020820191506020810190506020830392506139f7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000181905550838560010182815481101515613a6857fe5b90600052602060002090600202016000019080519060200190613a8c9291906146f0565b508460020160008154809291906001019190505550600091505b509392505050565b60608060008060009050613acc856000613ac788614426565b614434565b80945081955082965083","975050505050509193909250565b60008083600001836040518082805190602001908083835b602083101515613b215780518252602082019150602081019050602083039250613afc565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811415613b6c5760009150613d2f565b7fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f44454c45544500000000000000000000000000000000000000000000000000008152508688600001886040518082805190602001908083835b602083101515613c005780518252602082019150602081019050602083039250613bdb565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101604051613c47959493929190615233565b60405180910390a183600001836040518082805190602001908083835b602083101515613c895780518252602082019150602081019050602083039250613c64565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600080820160009055600182016000613cd591906147a2565b505060018460010160018303815481101515613ced57fe5b906000526020600020906002020160010160006101000a81548160ff021916908315150217905550836002016000815480929190600190039190505550600191505b5092915050565b60008084600001846040518082805190602001908083835b602083101515613d735780518252602082019150602081019050602083039250613d4e565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115613dbe5760009150613f23565b8285600001856040518082805190602001908083835b602083101515613df95780518252602082019150602081019050602083039250613dd4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001019080519060200190613e429291906146f0565b50846001018054809190600101613e599190614770565b90506001810185600001856040518082805190602001908083835b602083101515613e995780518252602082019150602081019050602083039250613e74565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000181905550838560010182815481101515613ee557fe5b90600052602060002090600202016000019080519060200190613f099291906146f0565b508460020160008154809291906001019190505550600191505b509392505050565b6000808460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111156140e2577fb878ca1044fc99f4084dda56da543f24ec9f652ef40a3cb97d5837c695ef47b132336040805190810160405280600681526020017f4d4f444946590000000000000000000000000000000000000000000000000000815250878960000160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161404e9594939291906151d9565b60405180910390a1828560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001915061423f565b828560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600101805480919060010161417b91906147ea565b9050600181018560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508385600101828154811015156141db57fe5b9060005260206000200160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460020160008154809291906001019190505550600091505b509392505050565b600081600201549050919050565b606080606080606060008088955087945084518651016040519080825280601f01601f19166020018201604052801561429d5781602001602082028038833980820191505090505b50935083925060009150600090505b855181101561435f5785818151811015156142c357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561432257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506142ac565b600090505b845181101561441757848181518110151561437b57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156143da57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050614364565b83965050505050505092915050565b600081600201549050919050565b6060806000806000806000808860405190808252806020026020018201604052801561446f5781602001602082028038833980820191505090505b509750886040519080825280602002602001820160405280156144a15781602001602082028038833980820191505090505b509650600093506000925060009550600094508993505b6144c28b856145c6565b156145b9576144d18b856145da565b915091508188848151811015156144e457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080878481518110151561452f57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600183019250858060010196505088861015156145a85761458c8b8561468c565b94506145988b866145c6565b15156145a357600094505b6145b9565b6145b28b8561468c565b93506144b8565b5050505093509350935093565b600082600101805490508210905092915050565b60008083600101838154811015156145ee57fe5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508360000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690509250929050565b600081806001019250505b8260010180549050821080156146d5575082600101828154811015156146b957fe5b9060005260206000200160000160149054906101000a900460ff165b156146e7578180600101925050614697565b81905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061473157805160ff191683800117855561475f565b8280016001018555821561475f579182015b8281111561475e578251825591602001919060010190614743565b5b50905061476c9190614816565b5090565b81548183558181111561479d5760020281600202836000526020600020918201910161479c919061483b565b5b505050565b50805460018160011615610100020316600290046000825580601f106147c857506147e7565b601f0160209004906000526020600020908101906147e69190614816565b5b50565b81548183558181111561481157818360005260206000209182019101614810919061487e565b5b505050565b61483891905b8082111561483457600081600090555060010161481c565b5090565b90565b61487b91905b80821115614877576000808201600061485a91906147a2565b6001820160006101000a81549060ff021916905550600201614841565b5090565b90565b6148d591905b808211156148d157600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905550600101614884565b5090565b90565b60006148e482356156f0565b905092915050565b60006148f882516156f0565b905092915050565b600082601f830112151561491357600080fd5b6004614926614921826155f3565b6155c6565b9150818385602084028201111561493c57600080fd5b60005b8381101561496c5781614952888261499e565b84526020840193506020830192505060018101905061493f565b5050505092915050565b60006149828235615710565b905092915050565b60006149968251615710565b905092915050565b60006149aa823561571c565b905092915050565b600082601f83011215156149c557600080fd5b81356149d86149d382615615565b6155c6565b915080825260208301602083018583830111156149f457600080fd5b6149ff83828461574a565b50505092915050565b600060208284031215614a1a57600080fd5b6000614a28848285016148ec565b91505092915050565b600080600060608486031215614a4657600080fd5b6000614a54868287016148d8565b9350506020614a65868287016148d8565b9250506040614a7686828701614976565b9150509250925092565b60008060008060006101008688031215614a9957600080fd5b6000614aa7888289016148d8565b9550506020614ab8888289016148d8565b9450506040614ac988828901614976565b935050606086013567ffffffff","ffffffff811115614ae657600080fd5b614af2888289016149b2565b9250506080614b0388828901614900565b9150509295509295909350565b60008060408385031215614b2357600080fd5b6000614b31858286016148ec565b9250506020614b428582860161498a565b9150509250929050565b600060208284031215614b5e57600080fd5b6000614b6c84828501614976565b91505092915050565b600060208284031215614b8757600080fd5b6000614b958482850161498a565b91505092915050565b60008060a08385031215614bb157600080fd5b6000614bbf85828601614976565b9250506020614bd085828601614900565b9150509250929050565b600060208284031215614bec57600080fd5b600082013567ffffffffffffffff811115614c0657600080fd5b614c12848285016149b2565b91505092915050565b60008060a08385031215614c2e57600080fd5b600083013567ffffffffffffffff811115614c4857600080fd5b614c54858286016149b2565b9250506020614c6585828601614900565b9150509250929050565b60008060408385031215614c8257600080fd5b600083013567ffffffffffffffff811115614c9c57600080fd5b614ca8858286016149b2565b925050602083013567ffffffffffffffff811115614cc557600080fd5b614cd1858286016149b2565b9150509250929050565b600080600060c08486031215614cf057600080fd5b600084013567ffffffffffffffff811115614d0a57600080fd5b614d16868287016149b2565b935050602084013567ffffffffffffffff811115614d3357600080fd5b614d3f868287016149b2565b9250506040614d5086828701614900565b9150509250925092565b614d63816156b0565b82525050565b6000614d748261566a565b808452602084019350614d8683615641565b60005b82811015614db857614d9c868351614d5a565b614da582615696565b9150602086019550600181019050614d89565b50849250505092915050565b614dcd81615675565b614dd68261564e565b60005b82811015614e0857614dec858351614e1e565b614df5826156a3565b9150602085019450600181019050614dd9565b5050505050565b614e18816156d0565b82525050565b614e27816156dc565b82525050565b6000614e388261568b565b808452614e4c816020860160208601615759565b614e558161578c565b602085010191505092915050565b6000614e6e82615680565b808452614e82816020860160208601615759565b614e8b8161578c565b602085010191505092915050565b600081546001811660008114614eb65760018114614ed657614f17565b607f600283041680865260ff198316602087015260408601935050614f17565b60028204808652602086019550614eec85615658565b60005b82811015614f0e57815481890152600182019150602081019050614eef565b80880195505050505b505092915050565b614f2881615726565b82525050565b614f3781615738565b82525050565b6000601782527f676574416c6c41737365747320466f7262696464656e210000000000000000006020830152604082019050919050565b6000600882527f61646441737365740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600c82527f676574416c6c41737365747300000000000000000000000000000000000000006020830152604082019050919050565b6000600e82527f61646420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000601b82527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006020830152604082019050919050565b6000600e82527f67657420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000600e82527f73657420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000601382527f616464417373657420466f7262696464656e21000000000000000000000000006020830152604082019050919050565b6000601182527f696e7365727420466f7262696464656e210000000000000000000000000000006020830152604082019050919050565b6000601182527f72656d6f766520466f7262696464656e210000000000000000000000000000006020830152604082019050919050565b61516c816156e6565b82525050565b60006020820190506151876000830184614d5a565b92915050565b60006080820190506151a26000830187614d5a565b6151af6020830186614d5a565b6151bc6040830185614d5a565b81810360608301526151ce8184614e2d565b905095945050505050565b600060a0820190506151ee6000830188614d5a565b6151fb6020830187614d5a565b818103604083015261520d8186614e63565b905061521c6060830185614d5a565b6152296080830184614d5a565b9695505050505050565b600060a0820190506152486000830188614d5a565b6152556020830187614d5a565b81810360408301526152678186614e63565b9050818103606083015261527b8185614e2d565b9050818103608083015261528f8184614e99565b90509695505050505050565b60006080820190506152b06000830186614d5a565b6152bd6020830185614d5a565b6152ca6040830184614f1f565b81810360608301526152db81614fab565b9050949350505050565b6000610100820190506152fb6000830187614d5a565b6153086020830186614f1f565b818103604083015261531981614f74565b9050818103606083015261532d8185614e2d565b905061533c6080830184614dc4565b95945050505050565b60006101008201905061535b6000830187614d5a565b6153686020830186614f1f565b818103604083015261537981614fab565b9050818103606083015261538d8185614e2d565b905061539c6080830184614dc4565b95945050505050565b6000610100820190506153bb6000830188614d5a565b6153c86020830187614f2e565b81810360408301526153da8186614e2d565b905081810360608301526153ee8185614e2d565b90506153fd6080830184614dc4565b9695505050505050565b600060608201905081810360008301526154218186614d69565b905081810360208301526154358185614d69565b90506154446040830184615163565b949350505050565b60006020820190506154616000830184614e0f565b92915050565b600060208201905081810360008301526154818184614e63565b905092915050565b600060208201905081810360008301526154a38184614e2d565b905092915050565b600060208201905081810360008301526154c481614f3d565b9050919050565b600060208201905081810360008301526154e481614fe2565b9050919050565b6000602082019050818103600083015261550481615019565b9050919050565b6000602082019050818103600083015261552481615050565b9050919050565b6000602082019050818103600083015261554481615087565b9050919050565b60006020820190508181036000830152615564816150be565b9050919050565b60006020820190508181036000830152615584816150f5565b9050919050565b600060208201905081810360008301526155a48161512c565b9050919050565b60006020820190506155c06000830184615163565b92915050565b6000604051905081810181811067ffffffffffffffff821117156155e957600080fd5b8060405250919050565b600067ffffffffffffffff82111561560a57600080fd5b602082029050919050565b600067ffffffffffffffff82111561562c57600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b6000819050919050565b60008160005260206000209050919050565b600081519050919050565b600060049050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000615731826156b0565b9050919050565b6000615743826156b0565b9050919050565b82818337600083830152505050565b60005b8381101561577757808201518184015260208101905061575c565b83811115615786576000848401525b50505050565b6000601f19601f8301169050919050565b6060600080836c0100000000000000000000000002915060146040519080825280601f01601f1916602001820160405280156157e85781602001602082028038833980820191505090505b509250600090505b601481101561587557818160148110151561580757fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002838281518110151561583857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506157f0565b50509190505600a265627a7a7230582020ec7e4487e102662f9c7af149d9b40270b31d8fd371a0593f6beec72980c0056c6578706572696d656e74616cf50037"};

    public static final String SM_BINARY = String.join("", SM_BINARY_ARRAY);

    public static final String[] ABI_ARRAY = {"[{\"constant\":true,\"inputs\":[],\"name\":\"ROLE_R\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OPENING_BANK\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ROLE_W\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"DATA\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"updateNonce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OWNER\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"BALANCE\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"insert\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"RECORD\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"PUB_KEY\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADMIN\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MODE_R\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE_ADMIN\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE_OWNER\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"add\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOrg\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MODE_W\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"remove\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OWNER_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"isFungible\",\"type\":\"bool\"}],\"name\":\"getAllAssets\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ASSETS\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"USER_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"removeWithSign\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"USER\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"getWithSign\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"size\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"asset\",\"type\":\"address\"},{\"name\":\"org\",\"type\":\"address\"},{\"name\":\"isFungible\",\"type\":\"bool\"}],\"name\":\"addAsset\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OPERATOR\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ROLE\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"isFungible\",\"type\":\"bool\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"getAllAssetsWithSign\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"set\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"asset\",\"type\":\"address\"},{\"name\":\"org\",\"type\":\"address\"},{\"name\":\"isFungible\",\"type\":\"bool\"},{\"name\":\"args\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"addAssetWithSign\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"addWithSign\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADMIN_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getAccountManager\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ID\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE_PUBLIC\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OPERATOR_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getAuthCenter\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getAuthManager\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"insertWithSign\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"setWithSign\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"KEY_ALL\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"funct","ion\"},{\"inputs\":[{\"name\":\"authCenterAddr\",\"type\":\"address\"},{\"name\":\"orgAddr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"logGet\",\"type\":\"event\"}]"};

    public static final String ABI = String.join("", ABI_ARRAY);

    public static final String FUNC_ROLE_R = "ROLE_R";

    public static final String FUNC_OPENING_BANK = "OPENING_BANK";

    public static final String FUNC_ROLE_W = "ROLE_W";

    public static final String FUNC_DATA = "DATA";

    public static final String FUNC_UPDATENONCE = "updateNonce";

    public static final String FUNC_OWNER = "OWNER";

    public static final String FUNC_BALANCE = "BALANCE";

    public static final String FUNC_INSERT = "insert";

    public static final String FUNC_RECORD = "RECORD";

    public static final String FUNC_PUB_KEY = "PUB_KEY";

    public static final String FUNC_ADMIN = "ADMIN";

    public static final String FUNC_MODE_R = "MODE_R";

    public static final String FUNC_TYPE_ADMIN = "TYPE_ADMIN";

    public static final String FUNC_TYPE_OWNER = "TYPE_OWNER";

    public static final String FUNC_ADD = "add";

    public static final String FUNC_GETORG = "getOrg";

    public static final String FUNC_MODE_W = "MODE_W";

    public static final String FUNC_REMOVE = "remove";

    public static final String FUNC_OWNER_ADDR = "OWNER_ADDR";

    public static final String FUNC_GETALLASSETS = "getAllAssets";

    public static final String FUNC_ASSETS = "ASSETS";

    public static final String FUNC_USER_ADDR = "USER_ADDR";

    public static final String FUNC_REMOVEWITHSIGN = "removeWithSign";

    public static final String FUNC_USER = "USER";

    public static final String FUNC_GETWITHSIGN = "getWithSign";

    public static final String FUNC_SIZE = "size";

    public static final String FUNC_ADDASSET = "addAsset";

    public static final String FUNC_OPERATOR = "OPERATOR";

    public static final String FUNC_ROLE = "ROLE";

    public static final String FUNC_GETALLASSETSWITHSIGN = "getAllAssetsWithSign";

    public static final String FUNC_SET = "set";

    public static final String FUNC_ADDASSETWITHSIGN = "addAssetWithSign";

    public static final String FUNC_ADDWITHSIGN = "addWithSign";

    public static final String FUNC_ADMIN_ADDR = "ADMIN_ADDR";

    public static final String FUNC_GETACCOUNTMANAGER = "getAccountManager";

    public static final String FUNC_ID = "ID";

    public static final String FUNC_ADDR = "ADDR";

    public static final String FUNC_TYPE_PUBLIC = "TYPE_PUBLIC";

    public static final String FUNC_OPERATOR_ADDR = "OPERATOR_ADDR";

    public static final String FUNC_TYPE = "TYPE";

    public static final String FUNC_GETAUTHCENTER = "getAuthCenter";

    public static final String FUNC_GETAUTHMANAGER = "getAuthManager";

    public static final String FUNC_INSERTWITHSIGN = "insertWithSign";

    public static final String FUNC_GETNONCE = "getNonce";

    public static final String FUNC_GET = "get";

    public static final String FUNC_SETWITHSIGN = "setWithSign";

    public static final String FUNC_KEY_ALL = "KEY_ALL";

    public static final Event LOGGET_EVENT = new Event("logGet", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<DynamicBytes>() {}));
    ;

    protected Account(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
    }

    public static String getBinary(CryptoSuite cryptoSuite) {
        return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
    }

    public byte[] ROLE_R() throws ContractException {
        final Function function = new Function(FUNC_ROLE_R, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] OPENING_BANK() throws ContractException {
        final Function function = new Function(FUNC_OPENING_BANK, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ROLE_W() throws ContractException {
        final Function function = new Function(FUNC_ROLE_W, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] DATA() throws ContractException {
        final Function function = new Function(FUNC_DATA, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt updateNonce() {
        final Function function = new Function(
                FUNC_UPDATENONCE, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void updateNonce(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_UPDATENONCE, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForUpdateNonce() {
        final Function function = new Function(
                FUNC_UPDATENONCE, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<BigInteger> getUpdateNonceOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_UPDATENONCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<BigInteger>(

                (BigInteger) results.get(0).getValue()
                );
    }

    public byte[] OWNER() throws ContractException {
        final Function function = new Function(FUNC_OWNER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] BALANCE() throws ContractException {
        final Function function = new Function(FUNC_BALANCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt insert(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_INSERT, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void insert(byte[] key, byte[] value, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_INSERT, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForInsert(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_INSERT, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<byte[], byte[]> getInsertInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_INSERT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<byte[], byte[]>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue()
                );
    }

    public Tuple1<Boolean> getInsertOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_INSERT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public byte[] RECORD() throws ContractException {
        final Function function = new Function(FUNC_RECORD, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] PUB_KEY() throws ContractException {
        final Function function = new Function(FUNC_PUB_KEY, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ADMIN() throws ContractException {
        final Function function = new Function(FUNC_ADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] MODE_R() throws ContractException {
        final Function function = new Function(FUNC_MODE_R, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] TYPE_ADMIN() throws ContractException {
        final Function function = new Function(FUNC_TYPE_ADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] TYPE_OWNER() throws ContractException {
        final Function function = new Function(FUNC_TYPE_OWNER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt add(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_ADD, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void add(byte[] key, byte[] value, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_ADD, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForAdd(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_ADD, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<byte[], byte[]> getAddInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_ADD, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<byte[], byte[]>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue()
                );
    }

    public Tuple1<Boolean> getAddOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_ADD, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public String getOrg() throws ContractException {
        final Function function = new Function(FUNC_GETORG, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public byte[] MODE_W() throws ContractException {
        final Function function = new Function(FUNC_MODE_W, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt remove(byte[] key) {
        final Function function = new Function(
                FUNC_REMOVE, 
                Arrays.<Type>asList(new DynamicBytes(key)), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void remove(byte[] key, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_REMOVE, 
                Arrays.<Type>asList(new DynamicBytes(key)), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForRemove(byte[] key) {
        final Function function = new Function(
                FUNC_REMOVE, 
                Arrays.<Type>asList(new DynamicBytes(key)), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<byte[]> getRemoveInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_REMOVE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<byte[]>(

                (byte[]) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getRemoveOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_REMOVE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public String OWNER_ADDR() throws ContractException {
        final Function function = new Function(FUNC_OWNER_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public Tuple3<List<String>, List<String>, BigInteger> getAllAssets(Boolean isFungible) throws ContractException {
        final Function function = new Function(FUNC_GETALLASSETS, 
                Arrays.<Type>asList(new Bool(isFungible)), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Address>>() {}, new TypeReference<DynamicArray<Address>>() {}, new TypeReference<Uint256>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple3<List<String>, List<String>, BigInteger>(
                convertToNative((List<Address>) results.get(0).getValue()), 
                convertToNative((List<Address>) results.get(1).getValue()), 
                (BigInteger) results.get(2).getValue());
    }

    public byte[] ASSETS() throws ContractException {
        final Function function = new Function(FUNC_ASSETS, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public String USER_ADDR() throws ContractException {
        final Function function = new Function(FUNC_USER_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt removeWithSign(byte[] key, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void removeWithSign(byte[] key, List<byte[]> sign, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForRemoveWithSign(byte[] key, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<byte[], List<byte[]>> getRemoveWithSignInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<StaticArray4<Bytes32>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<byte[], List<byte[]>>(

                (byte[]) results.get(0).getValue(), 
                convertToNative((List<Bytes32>) results.get(1).getValue())
                );
    }

    public Tuple1<Boolean> getRemoveWithSignOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public byte[] USER() throws ContractException {
        final Function function = new Function(FUNC_USER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] getWithSign(byte[] key, List<byte[]> sign) throws ContractException {
        final Function function = new Function(FUNC_GETWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public BigInteger size() throws ContractException {
        final Function function = new Function(FUNC_SIZE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        return executeCallWithSingleValueReturn(function, BigInteger.class);
    }

    public TransactionReceipt addAsset(String asset, String org, Boolean isFungible) {
        final Function function = new Function(
                FUNC_ADDASSET, 
                Arrays.<Type>asList(new Address(asset), 
                new Address(org), 
                new Bool(isFungible)), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void addAsset(String asset, String org, Boolean isFungible, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_ADDASSET, 
                Arrays.<Type>asList(new Address(asset), 
                new Address(org), 
                new Bool(isFungible)), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForAddAsset(String asset, String org, Boolean isFungible) {
        final Function function = new Function(
                FUNC_ADDASSET, 
                Arrays.<Type>asList(new Address(asset), 
                new Address(org), 
                new Bool(isFungible)), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<String, String, Boolean> getAddAssetInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_ADDASSET, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<String, String, Boolean>(

                (String) results.get(0).getValue(), 
                (String) results.get(1).getValue(), 
                (Boolean) results.get(2).getValue()
                );
    }

    public Tuple1<Boolean> getAddAssetOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_ADDASSET, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public byte[] OPERATOR() throws ContractException {
        final Function function = new Function(FUNC_OPERATOR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ROLE() throws ContractException {
        final Function function = new Function(FUNC_ROLE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public Tuple3<List<String>, List<String>, BigInteger> getAllAssetsWithSign(Boolean isFungible, List<byte[]> sign) throws ContractException {
        final Function function = new Function(FUNC_GETALLASSETSWITHSIGN, 
                Arrays.<Type>asList(new Bool(isFungible), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Address>>() {}, new TypeReference<DynamicArray<Address>>() {}, new TypeReference<Uint256>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple3<List<String>, List<String>, BigInteger>(
                convertToNative((List<Address>) results.get(0).getValue()), 
                convertToNative((List<Address>) results.get(1).getValue()), 
                (BigInteger) results.get(2).getValue());
    }

    public TransactionReceipt set(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_SET, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void set(byte[] key, byte[] value, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SET, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSet(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_SET, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<byte[], byte[]> getSetInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SET, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<byte[], byte[]>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue()
                );
    }

    public Tuple1<Boolean> getSetOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SET, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public TransactionReceipt addAssetWithSign(String asset, String org, Boolean isFungible, byte[] args, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_ADDASSETWITHSIGN, 
                Arrays.<Type>asList(new Address(asset), 
                new Address(org), 
                new Bool(isFungible), 
                new DynamicBytes(args), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void addAssetWithSign(String asset, String org, Boolean isFungible, byte[] args, List<byte[]> sign, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_ADDASSETWITHSIGN, 
                Arrays.<Type>asList(new Address(asset), 
                new Address(org), 
                new Bool(isFungible), 
                new DynamicBytes(args), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForAddAssetWithSign(String asset, String org, Boolean isFungible, byte[] args, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_ADDASSETWITHSIGN, 
                Arrays.<Type>asList(new Address(asset), 
                new Address(org), 
                new Bool(isFungible), 
                new DynamicBytes(args), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple5<String, String, Boolean, byte[], List<byte[]>> getAddAssetWithSignInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_ADDASSETWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<Bool>() {}, new TypeReference<DynamicBytes>() {}, new TypeReference<StaticArray4<Bytes32>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple5<String, String, Boolean, byte[], List<byte[]>>(

                (String) results.get(0).getValue(), 
                (String) results.get(1).getValue(), 
                (Boolean) results.get(2).getValue(), 
                (byte[]) results.get(3).getValue(), 
                convertToNative((List<Bytes32>) results.get(4).getValue())
                );
    }

    public Tuple1<Boolean> getAddAssetWithSignOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_ADDASSETWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public TransactionReceipt addWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void addWithSign(byte[] key, byte[] value, List<byte[]> sign, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForAddWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<byte[], byte[], List<byte[]>> getAddWithSignInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}, new TypeReference<StaticArray4<Bytes32>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<byte[], byte[], List<byte[]>>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue(), 
                convertToNative((List<Bytes32>) results.get(2).getValue())
                );
    }

    public Tuple1<Boolean> getAddWithSignOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public String ADMIN_ADDR() throws ContractException {
        final Function function = new Function(FUNC_ADMIN_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public String getAccountManager() throws ContractException {
        final Function function = new Function(FUNC_GETACCOUNTMANAGER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public byte[] ID() throws ContractException {
        final Function function = new Function(FUNC_ID, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ADDR() throws ContractException {
        final Function function = new Function(FUNC_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] TYPE_PUBLIC() throws ContractException {
        final Function function = new Function(FUNC_TYPE_PUBLIC, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public String OPERATOR_ADDR() throws ContractException {
        final Function function = new Function(FUNC_OPERATOR_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public byte[] TYPE() throws ContractException {
        final Function function = new Function(FUNC_TYPE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public String getAuthCenter() throws ContractException {
        final Function function = new Function(FUNC_GETAUTHCENTER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public String getAuthManager() throws ContractException {
        final Function function = new Function(FUNC_GETAUTHMANAGER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt insertWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void insertWithSign(byte[] key, byte[] value, List<byte[]> sign, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForInsertWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<byte[], byte[], List<byte[]>> getInsertWithSignInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}, new TypeReference<StaticArray4<Bytes32>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<byte[], byte[], List<byte[]>>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue(), 
                convertToNative((List<Bytes32>) results.get(2).getValue())
                );
    }

    public Tuple1<Boolean> getInsertWithSignOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public BigInteger getNonce() throws ContractException {
        final Function function = new Function(FUNC_GETNONCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        return executeCallWithSingleValueReturn(function, BigInteger.class);
    }

    public byte[] get(byte[] key) throws ContractException {
        final Function function = new Function(FUNC_GET, 
                Arrays.<Type>asList(new DynamicBytes(key)), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt setWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setWithSign(byte[] key, byte[] value, List<byte[]> sign, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value), 
                new StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<byte[], byte[], List<byte[]>> getSetWithSignInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}, new TypeReference<StaticArray4<Bytes32>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<byte[], byte[], List<byte[]>>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue(), 
                convertToNative((List<Bytes32>) results.get(2).getValue())
                );
    }

    public Tuple1<Boolean> getSetWithSignOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public byte[] KEY_ALL() throws ContractException {
        final Function function = new Function(FUNC_KEY_ALL, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public List<LogGetEventResponse> getLogGetEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(LOGGET_EVENT, transactionReceipt);
        ArrayList<LogGetEventResponse> responses = new ArrayList<LogGetEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogGetEventResponse typedResponse = new LogGetEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.logGetParam0 = (String) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.logGetParam1 = (String) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.logGetParam2 = (String) eventValues.getNonIndexedValues().get(2).getValue();
            typedResponse.logGetParam3 = (byte[]) eventValues.getNonIndexedValues().get(3).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogGetEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGGET_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeLogGetEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGGET_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public static Account load(String contractAddress, Client client, CryptoKeyPair credential) {
        return new Account(contractAddress, client, credential);
    }

    public static Account deploy(Client client, CryptoKeyPair credential, String authCenterAddr, String orgAddr) throws ContractException {
        String encodedConstructor = FunctionEncoder.encodeConstructor(Arrays.<Type>asList(new Address(authCenterAddr), 
                new Address(orgAddr)));
        return deploy(Account.class, client, credential, getBinary(client.getCryptoSuite()), encodedConstructor);
    }

    public static class LogGetEventResponse {
        public TransactionReceipt.Logs log;

        public String logGetParam0;

        public String logGetParam1;

        public String logGetParam2;

        public byte[] logGetParam3;
    }
}
